ace.define(
  'ace/mode/rst_highlight_rules',
  ['require', 'exports', 'module', 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'],
  function (require, exports, module) {
    'use strict';
    var oop = require('../lib/oop');
    var lang = require('../lib/lang');
    var TextHighlightRules = require('./text_highlight_rules').TextHighlightRules;
    var RSTHighlightRules = function () {
      var tokens = {
        title: 'markup.heading',
        list: 'markup.heading',
        table: 'constant',
        directive: 'keyword.operator',
        entity: 'string',
        link: 'markup.underline.list',
        bold: 'markup.bold',
        italic: 'markup.italic',
        literal: 'support.function',
        comment: 'comment',
      };
      var startStringPrefix = '(^|\\s|["\'(<\\[{\\-/:])';
      var endStringSuffix = '(?:$|(?=\\s|[\\\\.,;!?\\-/:"\')>\\]}]))';
      this.$rules = {
        start: [
          {
            token: tokens.title,
            regex: '(^)([\\=\\-`:\\.\'"~\\^_\\*\\+#])(\\2{2,}\\s*$)',
          },
          {
            token: ['text', tokens.directive, tokens.literal],
            regex: '(^\\s*\\.\\. )([^: ]+::)(.*$)',
            next: 'codeblock',
          },
          {
            token: tokens.directive,
            regex: '::$',
            next: 'codeblock',
          },
          {
            token: [tokens.entity, tokens.link],
            regex: '(^\\.\\. _[^:]+:)(.*$)',
          },
          {
            token: [tokens.entity, tokens.link],
            regex: '(^__ )(https?://.*$)',
          },
          {
            token: tokens.entity,
            regex: '^\\.\\. \\[[^\\]]+\\] ',
          },
          {
            token: tokens.comment,
            regex: '^\\.\\. .*$',
            next: 'comment',
          },
          {
            token: tokens.list,
            regex: '^\\s*[\\*\\+-] ',
          },
          {
            token: tokens.list,
            regex: '^\\s*(?:[A-Za-z]|[0-9]+|[ivxlcdmIVXLCDM]+)\\. ',
          },
          {
            token: tokens.list,
            regex: '^\\s*\\(?(?:[A-Za-z]|[0-9]+|[ivxlcdmIVXLCDM]+)\\) ',
          },
          {
            token: tokens.table,
            regex: '^={2,}(?: +={2,})+$',
          },
          {
            token: tokens.table,
            regex: '^\\+-{2,}(?:\\+-{2,})+\\+$',
          },
          {
            token: tokens.table,
            regex: '^\\+={2,}(?:\\+={2,})+\\+$',
          },
          {
            token: ['text', tokens.literal],
            regex: startStringPrefix + '(``)(?=\\S)',
            next: 'code',
          },
          {
            token: ['text', tokens.bold],
            regex: startStringPrefix + '(\\*\\*)(?=\\S)',
            next: 'bold',
          },
          {
            token: ['text', tokens.italic],
            regex: startStringPrefix + '(\\*)(?=\\S)',
            next: 'italic',
          },
          {
            token: tokens.entity,
            regex: '\\|[\\w\\-]+?\\|',
          },
          {
            token: tokens.entity,
            regex: ':[\\w-:]+:`\\S',
            next: 'entity',
          },
          {
            token: ['text', tokens.entity],
            regex: startStringPrefix + '(_`)(?=\\S)',
            next: 'entity',
          },
          {
            token: tokens.entity,
            regex: '_[A-Za-z0-9\\-]+?',
          },
          {
            token: ['text', tokens.link],
            regex: startStringPrefix + '(`)(?=\\S)',
            next: 'link',
          },
          {
            token: tokens.link,
            regex: '[A-Za-z0-9\\-]+?__?',
          },
          {
            token: tokens.link,
            regex: '\\[[^\\]]+?\\]_',
          },
          {
            token: tokens.link,
            regex: 'https?://\\S+',
          },
          {
            token: tokens.table,
            regex: '\\|',
          },
        ],
        codeblock: [
          {
            token: tokens.literal,
            regex: '^ +.+$',
            next: 'codeblock',
          },
          {
            token: tokens.literal,
            regex: '^$',
            next: 'codeblock',
          },
          {
            token: 'empty',
            regex: '',
            next: 'start',
          },
        ],
        code: [
          {
            token: tokens.literal,
            regex: '\\S``' + endStringSuffix,
            next: 'start',
          },
          {
            defaultToken: tokens.literal,
          },
        ],
        bold: [
          {
            token: tokens.bold,
            regex: '\\S\\*\\*' + endStringSuffix,
            next: 'start',
          },
          {
            defaultToken: tokens.bold,
          },
        ],
        italic: [
          {
            token: tokens.italic,
            regex: '\\S\\*' + endStringSuffix,
            next: 'start',
          },
          {
            defaultToken: tokens.italic,
          },
        ],
        entity: [
          {
            token: tokens.entity,
            regex: '\\S`' + endStringSuffix,
            next: 'start',
          },
          {
            defaultToken: tokens.entity,
          },
        ],
        link: [
          {
            token: tokens.link,
            regex: '\\S`__?' + endStringSuffix,
            next: 'start',
          },
          {
            defaultToken: tokens.link,
          },
        ],
        comment: [
          {
            token: tokens.comment,
            regex: '^ +.+$',
            next: 'comment',
          },
          {
            token: tokens.comment,
            regex: '^$',
            next: 'comment',
          },
          {
            token: 'empty',
            regex: '',
            next: 'start',
          },
        ],
      };
    };
    oop.inherits(RSTHighlightRules, TextHighlightRules);
    exports.RSTHighlightRules = RSTHighlightRules;
  },
);

ace.define(
  'ace/mode/rst',
  ['require', 'exports', 'module', 'ace/lib/oop', 'ace/mode/text', 'ace/mode/rst_highlight_rules'],
  function (require, exports, module) {
    'use strict';
    var oop = require('../lib/oop');
    var TextMode = require('./text').Mode;
    var RSTHighlightRules = require('./rst_highlight_rules').RSTHighlightRules;
    var Mode = function () {
      this.HighlightRules = RSTHighlightRules;
    };
    oop.inherits(Mode, TextMode);
    (function () {
      this.type = 'text';
      this.$id = 'ace/mode/rst';
      this.snippetFileId = 'ace/snippets/rst';
    }.call(Mode.prototype));
    exports.Mode = Mode;
  },
);
(function () {
  ace.require(['ace/mode/rst'], function (m) {
    if (typeof module == 'object' && typeof exports == 'object' && module) {
      module.exports = m;
    }
  });
})();
